/**
 * 手写bind方法
 */

// 伪代码
/* Function.prototype.myBind = function (ctx) {
  return function () {
    if (当前函数是new调用的) {
      new 原始函数();
    } else {
      原始函数.call(ctx);
    }
  };
}; */

Function.prototype.myBind = function (ctx) {
  // 取出ctx后面的参数
  const args = Array.prototype.slice.call(arguments, 1);
  // 拿到this
  const fn = this;

  return function A() {
    // 新函数里有参数
    const restArgs = Array.prototype.slice.call(arguments);
    const allArgs = args.concat(restArgs);

    // 判断新函数调用方式
    if (Object.getPrototypeOf(this) === A.prototype) {
      return new fn(...allArgs); // this不改变，指向fn创建的新对象
    }
    return fn.apply(ctx, allArgs); // this指向ctx
  };
};

function Fn(a, b) {
  console.log(this, a, b);
}

const newFn = Fn.myBind("ctx", 1, 2);
new newFn(3, 4);
